﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SIGCBI.Entities;
using System.Data;
using System.Data.Objects;

namespace SIGCBI.Repository
{
    public interface ITrabajadorRepository
    {
        List<TRABAJADOR> GetAllFromTrabajador();
        List<TRABAJADOR> GetAllFromTrabajadorByDescripcion(string descripcion);

        TRABAJADOR GetFromOnlyTrabajadorByDni(string dni);
        TRABAJADOR GetFromTrabajadorById(Int32 id);

        void AddTrabajador(TRABAJADOR Trabajador);
        void UpdateTrabajador(TRABAJADOR Trabajador);

        bool ExistImageHash(string hash, int id);

        bool ExistDuplicidadTrabajador(string dni, string nombreCompleto, Int32 id);
    }

    public class TrabajadorRepository : MasterDataAccess, ITrabajadorRepository
    {
        public List<TRABAJADOR> GetAllFromTrabajador()
        {
            var query = from p in Context.TRABAJADORes.Include("SEXO").Include("ESTADO_CIVIL")
                        select p;
            ObjectContext.Refresh(RefreshMode.StoreWins, query);
            return query.ToList();
        }

        public List<TRABAJADOR> GetAllFromTrabajadorByDescripcion(string descripcion)
        {
            var query = from p in Context.TRABAJADORes.Include("SEXO").Include("ESTADO_CIVIL").Include("USUARIO")
                        select p;

            if (descripcion != null && descripcion != string.Empty && descripcion != "")
            {
                query = from p in query
                        where p.Dni.Contains(descripcion) 
                        || p.ApeMaterno.ToUpper().Contains(descripcion) 
                        || p.ApePaterno.ToUpper().Contains(descripcion) 
                        || p.Nombres.ToUpper().Contains(descripcion)
                        || (p.ApePaterno.ToUpper() + " " + p.ApeMaterno.ToUpper()).Contains(descripcion.ToUpper())
                        || (p.ApePaterno.ToUpper() + " " + p.Nombres.ToUpper()).Contains(descripcion.ToUpper())
                        || (p.ApeMaterno.ToUpper() + " " + p.Nombres.ToUpper()).Contains(descripcion.ToUpper())
                        || (p.Nombres.ToUpper() + " " + p.ApeMaterno.ToUpper()).Contains(descripcion.ToUpper())
                        || (p.Nombres.ToUpper() + " " + p.ApePaterno.ToUpper()).Contains(descripcion.ToUpper())
                        || (p.ApePaterno.ToUpper() + " " + p.ApeMaterno.ToUpper() + " " + p.Nombres.ToUpper()).Contains(descripcion.ToUpper())
                        select p;
            }
            ObjectContext.Refresh(RefreshMode.StoreWins, query);
            return query.ToList();
        }

        public TRABAJADOR GetFromOnlyTrabajadorByDni(string dni)
        {
            var query = from p in Context.TRABAJADORes.Include("SEXO").Include("ESTADO_CIVIL")
                        where p.Dni.Contains(dni) //&& p.TRABAJADOR == null && p.DERECHO_HABIENTE.Count == 0
                        select p;
            ObjectContext.Refresh(RefreshMode.StoreWins, query);
            return query.SingleOrDefault();
        }

        public TRABAJADOR GetFromTrabajadorById(int id)
        {
            var query = from p in Context.TRABAJADORes
                        where p.ID.Equals(id)
                        select p;
            ObjectContext.Refresh(RefreshMode.StoreWins, query);
            return query.SingleOrDefault();
        }

        public void AddTrabajador(TRABAJADOR trabajador)
        {
            trabajador.ESTADO_CIVIL = null;
            trabajador.SEXO = null;
            
            //guardando FOTO del trabajador
            if (trabajador.FOTO_TRABAJADOR != null)
            {
                Context.Entry(trabajador.FOTO_TRABAJADOR ).State = EntityState.Added;
            }

            if (trabajador.ID.Equals(0))
            {
                Context.TRABAJADORes.Add(trabajador);
            }
                        
            Context.SaveChanges();
        }

        public void UpdateTrabajador(TRABAJADOR currTrabajador)
        {
            var trabajadorDB = Context.TRABAJADORes.Find(currTrabajador.ID);

            trabajadorDB.ApeMaterno = currTrabajador.ApeMaterno;
            trabajadorDB.ApePaterno = currTrabajador.ApePaterno;
            trabajadorDB.Direccion = currTrabajador.Direccion;
            trabajadorDB.Dni = currTrabajador.Dni;
            trabajadorDB.Email = currTrabajador.Email;
            trabajadorDB.FechaNacimiento = currTrabajador.FechaNacimiento;
            trabajadorDB.Edad = currTrabajador.Edad;
            trabajadorDB.IdEstadoCivil = currTrabajador.IdEstadoCivil;
            trabajadorDB.IdSexo= currTrabajador.IdSexo;
            trabajadorDB.Nombres = currTrabajador.Nombres;
            
            trabajadorDB.ESTADO_CIVIL = currTrabajador.ESTADO_CIVIL;
            trabajadorDB.SEXO = currTrabajador.SEXO;
            trabajadorDB.FOTO_TRABAJADOR = currTrabajador.FOTO_TRABAJADOR;
            
            if (trabajadorDB.FOTO_TRABAJADOR != null)
            {
                Context.Entry(trabajadorDB.FOTO_TRABAJADOR).State = EntityState.Modified;
            }

            Context.Entry(trabajadorDB).State = EntityState.Modified;
            
            
            Context.SaveChanges();
            
        }

        public bool ExistImageHash(string hash, int id)
        {
            var query = from p in Context.TRABAJADORes.Include("FOTO_TRABAJADOR")
                        where p.FOTO_TRABAJADOR.Hash.ToUpper().CompareTo(hash.ToUpper()) == 0 && p.ID != id
                        select p;

            return query.Any();
        }


        public bool ExistDuplicidadTrabajador(string dni, string nombreCompleto, int id)
        {
            var query = from c in Context.TRABAJADORes
                        where (c.Dni.ToUpper().CompareTo(dni.ToUpper()) == 0 || c.Nombres.ToUpper().CompareTo(nombreCompleto.ToUpper()) == 0)
                        && c.ID != id
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.Any();
        }
    }
}
